#include"user.h"
// 数据库句柄
sqlite3 *db;
// 函数声明
int create_table();
int register_user(const char *username, const char *password, int is_admin, const char *email, const char *phone);
int login_user(const char *username, const char *password, int *is_admin);
int set_admin(int user_id, int is_admin);
int update_user_info(int user_id, const char *new_password, const char *new_email, const char *new_phone);
int update_user_info_interactive(int user_id);
void print_user_info(int user_id);
void close_db();

int main()
{
    // 1. 打开数据库
    int rc = sqlite3_open("user_manage.db", &db);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
        return EXIT_FAILURE;
    }
    
    // 2. 创建用户表（如果不存在）
    if (create_table() != SQLITE_OK)
    {
        sqlite3_close(db);
        return EXIT_FAILURE;
    }
    
    int choice;
    while(1)
    {
        printf("欢迎使用用户管理系统！\n");
        printf("请选择操作：\n");
        printf("1. 注册新用户\n");
        printf("2. 用户登录\n");
        //printf("3. 更新个人信息\n");
        //printf("4. 退出\n");
        printf("请输入您的选择（1 / 2 ）：");
        scanf("%d", &choice);

        if (choice == 1)
        {
            char username[100], password[100], email[100], phone[100];
            int is_admin = 0;
            
            
            
            int identity_choice;
            printf("请选择您的身份：\n");
            printf("1. 管理员\n");
            printf("2. 学生\n");
            printf("请输入您的选择（1 或 2):");
            scanf("%d", &identity_choice);

            if(identity_choice == 1)
            {   
                char admin_password[100];
                printf("请输入管理员密码：");
                scanf("%s", admin_password);
                if(strcmp(admin_password, "123456789") == 0)
                {
                    is_admin = 1;
                    printf("管理员身份验证成功！\n");
                    // 注册新用户
                printf("请输入账号：");
                scanf("%s", username);
                printf("请输入密码：");
                scanf("%s", password);
                printf("请输入邮箱（可选）：");
                scanf("%s", email);
                printf("请输入电话号码（可选）：");
                scanf("%s", phone);
                }
                else
                {
                    printf("管理员密码错误！\n");
                }
            }
            else if(identity_choice == 2)
            {
                is_admin = 0;
                
                    // 注册新用户
                printf("请输入学号：");
                scanf("%s", username);
                printf("请输入密码：");
                scanf("%s", password);
                printf("请输入邮箱（可选）：");
                scanf("%s", email);
                printf("请输入电话号码（可选）：");
                scanf("%s", phone);
            } 
            else
            {
                printf("无效的身份选择！默认设置为普通用户。\n");
            }
            
            if(register_user(username, password, is_admin, email, phone) == SQLITE_OK)
            {
                printf("注册成功！\n");
            } 
            else 
            {
                printf("注册失败！\n");
            }
        } 
        else if (choice == 2) 
        {   
            while(1){
            // 用户登录
            char username[100], password[100];
            int is_admin;
            printf("请输入用户名：");
            scanf("%s", username);
            printf("请输入密码：");
            scanf("%s", password);
        
            
            if (login_user(username, password, &is_admin) == SQLITE_OK) 
            {
                printf("登录成功！是否管理员: %d\n", is_admin);
                int gchoice;
                while (1)
                {
                    printf("1. 更新个人信息");
                    printf("请输入您的选择（1 / 2 ）：");
                    scanf("%d", &gchoice);
                    if (gchoice == 1)
                    {
                        // 更新个人信息
                        int username;
                        printf("请输入您的用户ID：");
                        scanf("%d", &username);
            
                        // 修复调用问题
                        if(update_user_info_interactive(username) == SQLITE_OK)
                        {
                            printf("个人信息更新成功！\n");
                        }
                        else
                        {
                            printf("个人信息更新失败！\n");
                        }
                        break;
                    }
                    else if(gchoice == 2)
                    {
                        printf("退出系统。\n");
                        break;
                    }
        
                }
                break;
                
            }
            else 
            {
                printf("登录失败！\n");
                
            }
            }
        } 
        /*else if(choice == 3)
        {
            // 更新个人信息
            int username;
            printf("请输入您的用户ID：");
            scanf("%d", &username);
            
            // 修复调用问题
            if(update_user_info_interactive(username) == SQLITE_OK) {
                printf("个人信息更新成功！\n");
            } else {
                printf("个人信息更新失败！\n");
            }
        }
        else if(choice == 4)
        {
            printf("退出系统。\n");
            break;
        }*/
    }
    int gchoice;
    while (1)
    {
        printf("1. 更新个人信息");
        printf("请输入您的选择（1 / 2 ）：");
        scanf("%d", &gchoice);
        if (gchoice == 1)
        {
             // 更新个人信息
            int username;
            printf("请输入您的用户ID：");
            scanf("%d", &username);
            
            // 修复调用问题
            if(update_user_info_interactive(username) == SQLITE_OK)
            {
                printf("个人信息更新成功！\n");
            }
            else
            {
                printf("个人信息更新失败！\n");
            }
        }
        else if(gchoice == 2)
        {
            printf("退出系统。\n");
            break;
        }
        
    }


    // 4. 关闭数据库
    close_db();
    
    return EXIT_SUCCESS;
    
}

/**
 * 创建用户表
 * @return SQLITE_OK 或错误码
 */
int create_table() {
    char *err_msg = NULL;
    const char *sql = "CREATE TABLE IF NOT EXISTS users ("
                      "id INTEGER PRIMARY KEY AUTOINCREMENT,"
                      "username TEXT UNIQUE NOT NULL,"
                      "password TEXT NOT NULL,"
                      "is_admin INTEGER DEFAULT 0,"
                      "email TEXT,"
                      "phone TEXT"
                      ");";

    int rc = sqlite3_exec(db, sql, NULL, 0, &err_msg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "创建表失败: %s\n", err_msg);
        sqlite3_free(err_msg);
    }
    return rc;
}

/**
 * 用户注册 - 使用参数化查询
 * @param username 用户名
 * @param password 密码
 * @param is_admin 是否管理员（0: 普通用户, 1: 管理员）
 * @param email    邮箱
 * @param phone    手机号
 * @return SQLITE_OK 或错误码
 */
int register_user(const char *username, const char *password, int is_admin, const char *email, const char *phone) {
    sqlite3_stmt *stmt;
    const char *sql = "INSERT INTO users (username, password, is_admin, email, phone) VALUES (?, ?, ?, ?, ?)";
    int rc;

    rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "注册准备失败: %s\n", sqlite3_errmsg(db));
        return rc;
    }

    sqlite3_bind_text(stmt, 1, username, -1, SQLITE_STATIC);
    sqlite3_bind_text(stmt, 2, password, -1, SQLITE_STATIC);
    sqlite3_bind_int(stmt, 3, is_admin);
    sqlite3_bind_text(stmt, 4, email, -1, SQLITE_STATIC);
    sqlite3_bind_text(stmt, 5, phone, -1, SQLITE_STATIC);

    rc = sqlite3_step(stmt);
    if (rc != SQLITE_DONE) {
        fprintf(stderr, "注册失败: %s\n", sqlite3_errmsg(db));
    } else {
        printf("注册成功！用户: %s\n", username);
    }

    sqlite3_finalize(stmt);
    return rc == SQLITE_DONE ? SQLITE_OK : rc;
}

/**
 * 用户登录 - 使用参数化查询
 * @param username 用户名
 * @param password 密码
 * @param is_admin 返回是否管理员（输出参数）
 * @return SQLITE_OK 或错误码
 */
int login_user(const char *username, const char *password, int *is_admin) {
    int func(void *data, int cols, char **values, char **cols1)
    {
        int *is_admin = (int *)data;
        *is_admin = values[0] ? atoi(values[0]) : 0;
        return 0;
    }
    
    sqlite3_stmt *stmt;
    const char *sql = "SELECT is_admin FROM users WHERE username = ? AND password = ?";
    int rc;

    rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "登录准备失败: %s\n", sqlite3_errmsg(db));
        return rc;
    }

    sqlite3_bind_text(stmt, 1, username, -1, SQLITE_STATIC);
    sqlite3_bind_text(stmt, 2, password, -1, SQLITE_STATIC);

    rc = sqlite3_step(stmt);
    if (rc == SQLITE_ROW) {
        *is_admin = sqlite3_column_int(stmt, 0);
        printf("登录验证成功！\n");
        rc = SQLITE_OK;
    } else if (rc == SQLITE_DONE) {
        fprintf(stderr, "用户名或密码错误\n");
        rc = SQLITE_ERROR;
    } else {
        fprintf(stderr, "查询失败: %s\n", sqlite3_errmsg(db));
    }

    sqlite3_finalize(stmt);
    return rc;
}

/**
 * 设置管理员权限
 * @param user_id 用户ID
 * @param is_admin 是否管理员（0: 普通用户, 1: 管理员）
 * @return SQLITE_OK 或错误码
 */
int set_admin(int user_id, int is_admin) {
    char *err_msg = NULL;
    char sql[256];
    sprintf(sql, "UPDATE users SET is_admin = %d WHERE id = %d;", is_admin, user_id);

    int rc = sqlite3_exec(db, sql, NULL, 0, &err_msg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "设置权限失败: %s\n", err_msg);
        sqlite3_free(err_msg);
    } else {
        printf("权限设置成功！用户ID: %d, 是否管理员: %d\n", user_id, is_admin);
    }
    return rc;
}

/**
 * 更新用户信息交互函数
 * @param user_id 用户ID
 */
int update_user_info_interactive(int user_id) {
    char new_password[100] = {0};
    char new_email[100] = {0};
    char new_phone[100] = {0};
    int update_password = 0, update_email = 0, update_phone = 0;

    printf("当前用户ID: %d\n", user_id);
    printf("请选择要更新的字段（输入1更新，输入0跳过）：\n");
    printf("1. 更新密码\n");
    printf("2. 更新邮箱\n");
    printf("3. 更新电话号码\n");

    printf("更新密码 (1/0)：");
    scanf("%d", &update_password);
    if (update_password) {
        printf("请输入新密码：");
        scanf("%s", new_password);
    }

    printf("更新邮箱 (1/0)：");
    scanf("%d", &update_email);
    if (update_email) {
        printf("请输入新邮箱：");
        scanf("%s", new_email);
    }

    printf("更新电话号码 (1/0)：");
    scanf("%d", &update_phone);
    if (update_phone) {
        printf("请输入新电话号码：");
        scanf("%s", new_phone);
    }

    // 调用实际的更新函数
    return update_user_info(user_id, 
                           update_password ? new_password : NULL,
                           update_email ? new_email : NULL,
                           update_phone ? new_phone : NULL);
}

/**
 * 更新用户信息 - 使用参数化查询
 * @param user_id      用户ID
 * @param new_password 新密码（可为NULL）
 * @param new_email    新邮箱（可为NULL）
 * @param new_phone    新电话（可为NULL）
 */
int update_user_info(int user_id, const char *new_password, const char *new_email, const char *new_phone) {
    sqlite3_stmt *stmt;
    char sql[512] = "UPDATE users SET ";
    int param_count = 0;
    int bind_index = 1;
    int rc;
    
    // 构建SQL语句
    if (new_password) {
        if (param_count > 0) strcat(sql, ", ");
        strcat(sql, "password = ?");
        param_count++;
    }
    if (new_email) {
        if (param_count > 0) strcat(sql, ", ");
        strcat(sql, "email = ?");
        param_count++;
    }
    if (new_phone) {
        if (param_count > 0) strcat(sql, ", ");
        strcat(sql, "phone = ?");
        param_count++;
    }
    
    // 如果没有要更新的字段
    if (param_count == 0) {
        printf("没有指定要更新的字段！\n");
        return SQLITE_OK;
    }
    
    // 添加WHERE子句
    strcat(sql, " WHERE id = ?");
    
    // 准备SQL语句
    rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "更新信息准备失败: %s\n", sqlite3_errmsg(db));
        return rc;
    }

    // 绑定参数
    if (new_password) {
        sqlite3_bind_text(stmt, bind_index++, new_password, -1, SQLITE_STATIC);
    }
    if (new_email) {
        sqlite3_bind_text(stmt, bind_index++, new_email, -1, SQLITE_STATIC);
    }
    if (new_phone) {
        sqlite3_bind_text(stmt, bind_index++, new_phone, -1, SQLITE_STATIC);
    }
    sqlite3_bind_int(stmt, bind_index, user_id);

    // 执行更新操作
    rc = sqlite3_step(stmt);
    if (rc != SQLITE_DONE) {
        fprintf(stderr, "更新信息失败: %s\n", sqlite3_errmsg(db));
    } else {
        printf("信息更新成功！用户ID: %d\n", user_id);
    }

    sqlite3_finalize(stmt);
    return rc == SQLITE_DONE ? SQLITE_OK : rc;
}

/**
 * 打印用户信息
 * @param user_id 用户ID
 */
void print_user_info(int user_id) {
    int print_callback(void *data, int cols, char **values, char **cols1){
        printf("用户信息 (ID: %d):\n", user_id);
        for (int i = 0; i < cols; i++) {
            printf("%s: %s\n", cols1[i], values[i] ? values[i] : "NULL");
        }
        return 0;
    }
    
    char *err_msg = NULL;
    char sql[256];
    sprintf(sql, "SELECT * FROM users WHERE id = %d;", user_id);
    
    int rc = sqlite3_exec(db, sql, print_callback, 0, &err_msg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "查询失败: %s\n", err_msg);
        sqlite3_free(err_msg);
    }
}

/**
 * 关闭数据库
 */
void close_db()
{
    sqlite3_close(db);
    printf("数据库已关闭！\n");
}